package com.ruike.alisurface.ui.setting;

import android.annotation.SuppressLint;
import android.content.Context;

import ZtlApi.ZtlManager;

/**
 * 定昌的设备CMD操作类
 * https://github.com/Ztldc/ZtlApi/wiki/%E6%99%BA%E9%80%9A%E5%88%A9API%E6%96%87%E6%A1%A3
 */
public class DcDeviceOptionsUtils {

    static DcDeviceOptionsUtils dcDeviceOptionsUtils;

    public static DcDeviceOptionsUtils getInstance() {
        if (dcDeviceOptionsUtils == null) {
            synchronized (DcDeviceOptionsUtils.class) {
                if (dcDeviceOptionsUtils == null) {
                    dcDeviceOptionsUtils = new DcDeviceOptionsUtils();
                }
            }
        }
        return dcDeviceOptionsUtils;
    }

    /**
     * 初始化工具类
     *
     * @param context 上下文
     */
    public void init(Context context) {
        ZtlManager.GetInstance().setContext(context.getApplicationContext());
    }

    // ========================================================================================= 系统

    /**
     * 获取定昌的JAR包版本号
     */
    public String getJarVersion() {
        return ZtlManager.GetInstance().getJARVersion();
    }

    /**
     * 获取设备型号
     */
    public String getDeviceVersion() {
        return ZtlManager.GetInstance().getDeviceVersion();
    }

    /**
     * 获取系统版本
     */
    public String getAndroidVersion() {
        return ZtlManager.GetInstance().getAndroidVersion();
    }

    /**
     * 获取系统SDK版本
     */
    public int getSDKVersion() {
        return ZtlManager.GetInstance().getSDKVersion();
    }

    /**
     * 获取设备唯一ID
     */
    public String getDeviceID() {
        return ZtlManager.GetInstance().getDeviceID();
    }

    /**
     * 获取内部存储大小(字节）
     */
    public long getTotalInternalMemorySize() {
        return ZtlManager.GetInstance().getTotalInternalMemorySize();
    }

    /**
     * 获取剩余存储大小(字节）
     */
    public long getFreeMemory() {
        return ZtlManager.GetInstance().getFreeMemory();
    }

    /**
     * 获取剩余运行内存(字节）
     */
    public long getFreeMemorySize() {
        return ZtlManager.GetInstance().getFreeMemorySize();
    }

    /**
     * 获取内部SD卡路径
     */
    public String getInternalSDCardPath() {
        return ZtlManager.GetInstance().getInternalSDCardPath();
    }

    /**
     * 重启设备
     *
     * @param delay 延时时间，单位：秒
     */
    public void reboot(int delay) {
        ZtlManager.GetInstance().reboot(delay);
    }

    /**
     * 截取屏幕
     *
     * @param savePath     保存文件夹路径，例如 /sdcard/
     * @param saveFileName 保存文件名称，例如 1.png
     */
    public void startScreenShot(String savePath, String saveFileName) {
        ZtlManager.GetInstance().startScreenShot(savePath, saveFileName);
    }

    /**
     * 判断包名对应的APP是否存在
     *
     * @param pkgName 需要判断的APP包名
     * @return true = 存在； false = 不存在
     */
    public boolean isAppExist(String pkgName) {
        return ZtlManager.GetInstance().isAppExist(pkgName);
    }

    /**
     * 打开系统设置界面
     */
    public void startSettings() {
        ZtlManager.GetInstance().startSettings();
    }

    /**
     * 打开或关闭导航栏与状态栏
     *
     * @param isOpen 是否打开系统导航栏，true：显示，false：隐藏
     */
    public void openSystemBar(boolean isOpen) {
        ZtlManager.GetInstance().openSystemBar(isOpen);
    }

    /**
     * 获取当前导航栏状态
     *
     * @return 是否打开系统导航栏，true：显示，false：隐藏
     */
    public boolean isSystemBarOpen() {
        return ZtlManager.GetInstance().isSystemBarOpen();
    }

    /**
     * 卸载APP
     *
     * @param packageName 卸载程序的包名
     */
    public void uninstallAppSilent(String packageName) {
        ZtlManager.GetInstance().uninstallAppSilent(packageName);
    }

    /**
     * 静默安装并启动APK
     *
     * @param installApkPath 需要安装的APK路径
     * @param packageName    要启动的APP包名
     */
    public void installAppAndStartUp(String installApkPath, String packageName) {
        ZtlManager.GetInstance().installAppAndStartUp(installApkPath, packageName);
    }

    /**
     * 守护进程，保持APP置顶状态
     * 在程序被切换到后台或关闭时，自动返回或启动该 app。保持该 app 在前端。用于售货机 ATM 广告机 等必须保活的应用。当需要打开系统设置界面或运行其他 app 暂时进行其他设置时，请先调用取消接口。否则会一直保持 app 置顶导致无法操作。
     *
     * @param packageName 需要保持置顶的APP
     */
    public void keepActivity(String packageName) {
        ZtlManager.GetInstance().keepActivity(packageName);
    }

    /**
     * 守护进程，保持APP置顶状态
     * 在程序被切换到后台或关闭时，自动返回或启动该 app。保持该 app 在前端。用于售货机 ATM 广告机 等必须保活的应用。当需要打开系统设置界面或运行其他 app 暂时进行其他设置时，请先调用取消接口。否则会一直保持 app 置顶导致无法操作。
     *
     * @param packageName 需要保持置顶的APP
     * @param sec         设置保活时间，最低为2，如设置为2，会在守护程序退出后2s后进行拉起
     */
    public void keepActivity(String packageName, int sec) {
        ZtlManager.GetInstance().keepActivity(packageName, sec);
    }

    /**
     * 取消守护进程，取消置顶状态
     */
    public void unKeepActivity() {
        ZtlManager.GetInstance().unKeepActivity();
    }

    /**
     * 保活某个服务
     *
     * @param packageName 保活服务的APP包名 例如：com.voodoo.appdaemon
     * @param service     需要保活的服务 例如：com.voodoo.appdaemon.service.MainProgramFrontService
     */
    public void keepService(String packageName, String service) {
        ZtlManager.GetInstance().keepService(packageName, service);
    }

    /**
     * 保活某个服务
     *
     * @param packageName 保活服务的APP包名 例如：com.voodoo.appdaemon
     * @param service     需要保活的服务 例如：com.voodoo.appdaemon.service.MainProgramFrontService
     * @param sec         检测间隔时间，单位：秒
     */
    public void keepService(String packageName, String service, int sec) {
        ZtlManager.GetInstance().keepService(packageName, service, sec);
    }

    /**
     * 取消保活服务，此操作并不会把服务杀死
     */
    public void unKeepService() {
        ZtlManager.GetInstance().unkeepService();
    }

    // ========================================================================================= 显示

    /**
     * 获取屏幕分辨率X轴
     */
    public int getDisplayWidth() {
        return ZtlManager.GetInstance().getDisplayWidth();
    }

    /**
     * 获取屏幕分辨率Y轴
     */
    public int getDisplayHeight() {
        return ZtlManager.GetInstance().getDisplayHeight();
    }

    /**
     * 获取屏幕密度 dpis
     */
    public int getDisplayDensity() {
        return ZtlManager.GetInstance().getDisplayDensity();
    }

    /**
     * 获取Android系统亮度
     */
    public int getSystemBrightness() {
        return ZtlManager.GetInstance().getSystemBrightness();
    }

    /**
     * 获取Android系统最大亮度值
     */
    public int getSystemMaxBrightness() {
        return ZtlManager.GetInstance().getSystemMaxBrightness();
    }

    /**
     * 设置系统亮度
     *
     * @param brightness 亮度值：0-255
     */
    public void setBrightness(int brightness) {
        ZtlManager.GetInstance().setBrightness(brightness);
    }

    /**
     * 设置字体大小
     *
     * @param sizeType 1：较小; 2：正常; 3：较大; 4：最大
     */
    public void setFontSize(int sizeType) {
        if (sizeType < 1 || sizeType > 4) {
            sizeType = 2;
        }
        ZtlManager.GetInstance().setFontSize(sizeType);
    }

    // ========================================================================================= 网络

    /**
     * 获取当前连接的网络类型
     * 一般用于检测 wifi 和以太网同时连接时判断连接的是哪个网络
     * android:name="android.permission.ACCESS_NETWORK_STATE"
     *
     * @return -1：未知网络；0：以太网；1：wifi；2：2g；3：3g；4：4g；5：5g
     */
    public int getNetWorkType() {
        return ZtlManager.GetInstance().getNetWorkType();
    }

    /**
     * 获取MAC地址
     * 获取 Android 系统 MAC 地址。这里获取的是 eth0 节点的 mac
     *
     * @return Android设备MAC地址
     */
    public String getMacAddress() {
        return ZtlManager.GetInstance().getMacAddress();
    }

    /**
     * 获取IPv4地址
     * 获取 Android 系统 IPv4 地址
     * android:name="android.permission.ACCESS_NETWORK_STATE"
     *
     * @return Android设备IPv4地址
     */
    public String getLocalIpAddress() {
        return ZtlManager.GetInstance().getLocalIpAddress();
    }

    /**
     * 获取指定网络的IPv4地址
     *
     * @param netType 网络类型  1:以太网；2:wifi；3:电话卡
     * @return 指定网络的IPv4地址
     */
    public String getIPV4(int netType) {
        String type;
        switch (netType) {
            case 1:
                type = "ech0"; // 以太网
                break;
            case 2:
                type = "wlan0"; // WIFI
                break;
            default:
                type = "ppp0"; // 电话卡
                break;
        }
        return ZtlManager.GetInstance().getIPv4(type);
    }

    /**
     * 指定wifi掉线重连
     * 连接指定 wifi 断线重连。由于 wifi 信号强度差或所连的 wifi 网络不可达等原因， 系统有时不会重连到指定网络。启用这个功能后，系统会保持连接到指定 wifi。请确保所 用的 wifi 在信号范围内，且能正常连接。如果启用该功能后，锁定的 wifi 不在信号范围内， 可以正常连接其他 wifi。
     *
     * @param ssid     WiFi名称
     * @param password WiFi密码
     */
    public void keepWifiConnect(String ssid, String password) {
        ZtlManager.GetInstance().keepWifiConnect(ssid, password);
    }

    /**
     * 指定wifi停止掉线重连
     * 将 keepWifiConnect 配置的 wifi 不自动重连。此功能不会导致当前的 wifi 断开或关闭
     */
    public void stopKeepWifiConnect() {
        ZtlManager.GetInstance().stopKeepWifiConnect();
    }

    /**
     * 禁用或启用网络ADB
     * 启用：在没有 OTG 线的情况下，可启用网络 adb 连接网线进行调试。禁用：可保护主板信息不外泄
     *
     * @param enable true：启用网络adb调试；false：不启用网络adb调试
     */
    public void setNetAdb(boolean enable) {
        ZtlManager.GetInstance().setNetAdb(enable);
    }

    /**
     * 获取4G模块IMEI信息
     * android.permission.READ_PHONE_STATE
     *
     * @return 4G模块IMEI信息
     */
    @SuppressLint("MissingPermission")
    public String getImei() {
        return ZtlManager.GetInstance().getImei();
    }

    /**
     * 获取SIM卡TEL信息
     * android.permission.READ_PHONE_STATE
     *
     * @return SIM 卡的号码信息
     */
    @SuppressLint("MissingPermission")
    public String getSimTel() {
        return ZtlManager.GetInstance().getSimTel();
    }

    /**
     * 获取SIM卡ICCID信息
     * android.permission.READ_PHONE_STATE
     *
     * @return SIM 卡的 ICCID 信息
     */
    @SuppressLint("MissingPermission")
    public String getSimIccid() {
        return ZtlManager.GetInstance().getSimIccid();
    }

    /**
     * 获取SIM卡IMSI信息
     * android.permission.READ_PHONE_STATE
     *
     * @return SIM 卡的 IMSI 信息
     */
    @SuppressLint("MissingPermission")
    public String getSimImsi() {
        return ZtlManager.GetInstance().getSimImsi();
    }

    /**
     * 获取SIM卡运营商信息
     *
     * @return SIM 卡的运营商信息
     */
    public String getSimOperator() {
        return ZtlManager.GetInstance().getSimOperator();
    }

    /**
     * 获取4G模块基带版本信息
     *
     * @return 4G模块基带版本信息
     */
    public String getBaseBand() {
        return ZtlManager.GetInstance().getBaseBand();
    }


    // ========================================================================================= 文件

    /**
     * 判断文件是否存在
     *
     * @param path 文件路径
     * @return true：文件存在；false：文件不存在
     */
    public boolean isExist(String path) {
        if (path == null || path.isEmpty()) {
            return false;
        }
        return ZtlManager.GetInstance().isExist(path);
    }

    /**
     * 计算GPIO值
     *
     * @param port GPIO口
     * @return GPIO值
     */
    public int gpioStringToInt(String port) {
        return ZtlManager.GetInstance().gpioStringToInt(port);
    }

    /**
     * 设置GPIO输出值
     *
     * @param port GPIO口
     * @return GPIO值
     */
    public void setGpioValue(String port, int value) {
        ZtlManager.GetInstance().setGpioValue(port, value);
    }

    /**
     * 获取GPIO方向
     *
     * @param port GPIO口
     * @return "in":输入   ”out“：输出   ”unknown“：未知
     */
    public String getGpioDirection(String port) {
        return ZtlManager.GetInstance().getGpioDirection(port);
    }

    /**
     * 设置GPIO方向
     *
     * @param port GPIO口
     * @param isIn 是否设置为输入
     */
    public void setGpioDirection(String port, boolean isIn) {
        ZtlManager.GetInstance().setGpioDirection(port, isIn ? "in" : "out");
    }

    // ========================================================================================= 文件

    /**
     * 执行CMD命令并获取返回值
     *
     * @param cmd 执行的CMD指令
     * @return 执行完成返回的值
     */
    public String execRootCmd(String cmd) {
        return ZtlManager.GetInstance().execRootCmd(cmd);
    }


}
